home *** CD-ROM | disk | FTP | other *** search
/ Eagles Nest BBS 1 / Eagles_Nest_Mac_Collection_Disc_1.TOAST / System & Related / UNIXNut#2 / Guide / stack.txt < prev   
Text File  |  1989-06-08  |  27KB  |  930 lines

  1. -- stack: in
  2. -- format: 8 (HyperCard 1)
  3. -- flags: 0x1000 (none)
  4. -- protect password hash: 0
  5. -- maximum user level: 5 (scripting)
  6. -- window: Rect(x1=0, y1=0, x2=0, y2=0)
  7. -- screen: Rect(x1=0, y1=0, x2=0, y2=0)
  8. -- card dimensions: w=0 h=0
  9. -- scroll: x=0 y=0
  10. -- background count: 8
  11. -- first background id: 2576
  12. -- card count: 55
  13. -- first card id: 3761
  14. -- list block id: 16567
  15. -- print block id: 3353
  16. -- font table block id: 0
  17. -- style table block id: 0
  18. -- free block count: 0
  19. -- free size: 0 bytes
  20. -- total size: 116992 bytes
  21. -- stack block size: 24064 bytes
  22. -- created by hypercard version: 0x00000000
  23. -- compacted by hypercard version: 0x01228000
  24. -- modified by hypercard version: 0x01228000
  25. -- opened by hypercard version: 0x01228000
  26. -- patterns[0]: 0x0000000000000000
  27. -- patterns[1]: 0x0000220000002200
  28. -- patterns[2]: 0x8800220088002200
  29. -- patterns[3]: 0xCC003300CC003300
  30. -- patterns[4]: 0xCC883322CC883322
  31. -- patterns[5]: 0xEE88BB22EE88BB22
  32. -- patterns[6]: 0xEECCBB33EECCBB33
  33. -- patterns[7]: 0xFFCCFF33FFCCFF33
  34. -- patterns[8]: 0xFFEEFFBBFFEEFFBB
  35. -- patterns[9]: 0xFFFFFFBBFFFFFFBB
  36. -- patterns[10]: 0x8010022001084004
  37. -- patterns[11]: 0xFFFFFFFFFFFFFFFF
  38. -- patterns[12]: 0x8822882288228822
  39. -- patterns[13]: 0xEEDDBB77EEDDBB77
  40. -- patterns[14]: 0xC4800C6843023026
  41. -- patterns[15]: 0xB130031BD8C00C8D
  42. -- patterns[16]: 0xAA00AA00AA00AA00
  43. -- patterns[17]: 0x8822552288225522
  44. -- patterns[18]: 0x8855225588552255
  45. -- patterns[19]: 0x77DD77DD77DD77DD
  46. -- patterns[20]: 0x8000000000000000
  47. -- patterns[21]: 0xAA55AA55AA55AA55
  48. -- patterns[22]: 0x038448300C020101
  49. -- patterns[23]: 0x8244394482010101
  50. -- patterns[24]: 0x8814224188412214
  51. -- patterns[25]: 0x8080413E080814E3
  52. -- patterns[26]: 0x22048C7422179810
  53. -- patterns[27]: 0xBE808808EB088880
  54. -- patterns[28]: 0x25C8328964244C92
  55. -- patterns[29]: 0xA29C41BE2AC914EB
  56. -- patterns[30]: 0x40A00000040A0000
  57. -- patterns[31]: 0x8040200002040800
  58. -- patterns[32]: 0xAA00800088008000
  59. -- patterns[33]: 0xFF80808080808080
  60. -- patterns[34]: 0x081C22C180010204
  61. -- patterns[35]: 0xFF808080FF080808
  62. -- patterns[36]: 0xF87422478F172271
  63. -- patterns[37]: 0xBF00BFBFB0B0B0B0
  64. -- patterns[38]: 0xFF7FBE5DA2418000
  65. -- patterns[39]: 0xFAF5FAF5A050A050
  66. -- checksum: 0x0
  67. ----- HyperTalk script -----
  68. ---General Application Handlers
  69.  
  70. on idle  --  call ShowMenu every so often just in case our menus vanished
  71.   global menu1, menu2, lastTick
  72.   if (the ticks-lastTick)>120 then  --  gives better performance than on every iteration
  73.     put the ticks into lastTick
  74.     ShowMenu(menu1)
  75.     ShowMenu(menu2)
  76.   end if
  77.   pass idle
  78. end idle
  79.  
  80. on placeMark lineNum
  81.   -- put name of card into array listofCards
  82.   -- Called by closeStack to keep track of last card viewed in each stack.
  83.   global listofCards, stackRef
  84.   put the long name of this card into line stackRef of listOfCards
  85. end placeMark
  86.  
  87. on goPlaces stackName, lineNum
  88.   -- used to return to placeMark
  89.   -- called by Menu 1 selections to return to last card viewed.
  90.   global listofCards
  91.   delete first char of stackName
  92.   delete last char of stackName
  93.   if line lineNum of listofCards contains stackName then
  94.     go to (line lineNum of listofCards)
  95.   else
  96.     go to stackName
  97.   end if
  98. end goPlaces
  99.  
  100. on openSection menuRef
  101.   --called by Section openCard handler to put away links and topics.
  102.   --BeenHereBefore keeps track of last section visited.
  103.   global menu2,BeenHereBefore
  104.   checkmenu menu2,menuRef,true
  105.   put the short name of this card into thisSection
  106.   if beenHereBefore is not thisSection then
  107.     put empty into card field "lastTopic"
  108.   else
  109.     get card field "lastTopic"
  110.     if it is not empty then
  111.       send mouseUp to card button ("topic" & it)
  112.     end if
  113.   end if
  114.   put thisSection into BeenHereBefore
  115. end openSection
  116.  
  117. on closeSection menuRef
  118.   --called by Section closeCard handler to put away links and topics.
  119.   --Both are put away when you leave the section card, but OpenSection
  120.   --will reopen the topic field if this section is the last one visited.
  121.   global menu2
  122.   checkmenu menu2,menuRef,false
  123.   set lockScreen to true
  124.   get card field "lastTopic"
  125.   if it is not empty then
  126.     set the style of card button it to transparent
  127.     set hilite of card button ("Topic"&it) to false
  128.     hide card field "Topics"
  129.     hide card button "Topics"
  130.     hide card button "Box"
  131.   end if
  132.   if hilite of background button "LinkUp" is true then
  133.     hide background button "Links"
  134.     hide card field "Links"
  135.     set the hilite of background button "LinkUp" to false
  136.   end if
  137. end closeSection
  138.  
  139. ---String search handlers
  140.  
  141. on mouseUp
  142.   --catch all clicks on fields and get the word clicked on for search
  143.   if the target contains "field" then
  144.     getkey
  145.   end if
  146. end mouseUp
  147.  
  148. on goSearch
  149.   --Called by squirrel icon to prompt for Command or Keyword search.
  150.   answer "Go to UNIX Command or Find Keyword?" with "Command" or "Keyword" or "Cancel"
  151.   if it is "Cancel" then exit goSearch
  152.   if it is "Command" then
  153.     askCommand
  154.   else
  155.     headSearch
  156.   end if
  157. end goSearch
  158.  
  159. on askCommand
  160.   --Called by goSearch to look up UNIX command.
  161.   --Also marks current card.
  162.   global whereToGoBack
  163.   Ask "What UNIX command?"
  164.   if it is empty then exit askCommand
  165.   set cursor to 4
  166.   if the number of chars in it is 1 then
  167.     set lockScreen to true
  168.     go to first card of stack "Commands"
  169.     find it in field 1
  170.     repeat until the short name of this background is "Commands"
  171.       find it in field 1
  172.     end repeat
  173.     set lockScreen to false
  174.   else
  175.     go to card (it) of stack "Commands"
  176.     if the result is not empty then
  177.       answer quote & it & quote && "command not found"
  178.       exit askCommand
  179.     end if
  180.   end if
  181.   push recent card
  182.   pop card into WhereToGoBack
  183. end askCommand
  184.  
  185. on headSearch
  186.   --Called by goSearch; look for search string in heading
  187.   --then continue looking in body text. If not found, look in
  188.   --Overall Index; Card is automatically marked for return.
  189.   global whereToGoBack,searchKey
  190.   push card
  191.   pop card into thisCard
  192.   if searchKey is empty then
  193.     ask "Search for Keyword in Headings:"
  194.   else
  195.     ask "Search for Keyword in Headings:" with searchKey
  196.   end if
  197.   if it is empty then exit headSearch
  198.   put it into searchKey
  199.   find searchKey in field 4
  200.   if the result is "not found" then
  201.     find searchKey in field 1
  202.     if the result is "not found" then
  203.       answer "Continue Search in Text or in Overall Index?" with "Text" or "Index" or "Cancel"
  204.       if it is "Cancel" then exit headSearch
  205.       if it is "Text" then
  206.         find searchKey
  207.         if the result is empty then
  208.           verifySearch
  209.         else
  210.           answer "Continue Search in Overall Index?" with "Index" or "Cancel"
  211.           if it is "Cancel" then exit headSearch
  212.         end if
  213.       end if
  214.       if it is "Index" then
  215.         set lockscreen to true
  216.         go to last card of "Nutshell"
  217.         send "indexSearch 1" to this card
  218.         set lockscreen to false
  219.       end if
  220.     end if
  221.   end if
  222.   if the id of this card is not in thisCard then
  223.     put thisCard into whereToGoBack
  224.   end if
  225. end headSearch
  226.  
  227. on cardSearch
  228.   --Limit search to card.  Used for the index or long lists.
  229.   --Defines global searchKey to permit continuation of search.
  230.   global searchKey
  231.   if searchKey is empty then
  232.     ask "Enter keyword to look up:"
  233.   else
  234.     ask "Enter keyword to look up:" with searchKey
  235.   end if
  236.   put it into searchKey
  237.   if searchKey is not empty then
  238.     put 0 into notFound
  239.     put the id of this card into thisCard
  240.     set lockscreen to true
  241.     find word searchKey
  242.     if the result is "not found" then
  243.       put 1 into notFound
  244.     end if
  245.     if the id of this card is not thisCard
  246.     then
  247.     go back
  248.     put 1 into notFound
  249.   end if
  250.   if notFound is 1 then
  251.     find searchKey
  252.     if the result is not empty then
  253.       answer quote & searchKey & quote && "not found."
  254.     end if
  255.     if the id of this card is not thisCard
  256.     then
  257.     go back
  258.     answer quote & searchKey & quote && "not found on this card."
  259.   end if
  260. end if
  261. end if
  262. set lockScreen to false
  263. end cardSearch
  264.  
  265. on returnKey
  266.   --enable search to continue if searchKey is defined
  267.   global searchKey
  268.   if searchKey is not empty and the visible of the msg box is false then
  269.     put "find" && quote & searchKey & quote into continueSearch
  270.     do ContinueSearch
  271.     verifySearch
  272.   else
  273.     pass returnKey
  274.   end if
  275. end returnKey
  276.  
  277. on verifySearch
  278.   --Handle text found in hidden field by displaying FoundLine
  279.   --in message box. Called by Return Key & Keyword Requires Ver 1.2
  280.   if the version is 1.2 then
  281.     if the visible of the foundField is false then
  282.       put "put" && the FoundLine into showLine
  283.       do showLine
  284.       answer "Line Found in Hidden Field. Continue Search?" with "Yes" or "No"
  285.       hide msg box
  286.       if it is "Yes" then
  287.         send returnKey to this card
  288.       end if
  289.     end if
  290.   end if
  291. end verifySearch
  292.  
  293. on getKey
  294.   -- get word at click loc of current field and find it
  295.   -- string saved in searchKey so that ReturnKey will allow
  296.   -- search to continue.  Most of the time, getKey encloses
  297.   -- the word clicked in a box; you have to press returnkey for results.
  298.   global searchKey
  299.   get clickSelect()
  300.   if it is empty then exit getkey
  301.   put it into searchKey
  302.   find searchKey
  303. end getKey
  304.  
  305. ---Link Processing
  306.  
  307. on PopUp CBnum,topics
  308.   --Script called by Topic button to put list of topics
  309.   --in popUp field
  310.   set lockScreen to true
  311.   put "card button" && CBnum into CB
  312.   if the style of CB is "rectangle" then
  313.     set style of CB to transparent
  314.     hide card field "Topics"
  315.     hide card button "Topics"
  316.     hide card button "Box"
  317.     set the hilite of the target to false
  318.     put empty into card field "lastTopic"
  319.   else
  320.     get card field "lastTopic"
  321.     if it is not empty then
  322.       set hilite of card button ("Topic"&it) to false
  323.       set the style of card button it to transparent
  324.     end if
  325.     set style of CB to rectangle
  326.     put CBnum into card field "lastTopic"
  327.     put topics into card field "Topics"
  328.     show card field "Topics"
  329.     show card button "Topics"
  330.     show card button "Box"
  331.     set the hilite of the target to true
  332.   end if
  333.   set lockScreen to false
  334. end PopUp
  335.  
  336. on popDown
  337.   --Handler called by Topic box button to hide Topic popUp field.
  338.   set lockScreen to true
  339.   get card field "lastTopic"
  340.   if it is not empty then
  341.     set the style of card button it to transparent
  342.     set hilite of card button ("Topic"&it) to false
  343.   end if
  344.   hide card field "Topics"
  345.   hide card button "Topics"
  346.   hide card button "Box"
  347.   put empty into card field "lastTopic"
  348.   set lockScreen to false
  349. end popDown
  350.  
  351. on linkUp
  352.   --Handler for linkUp button that displays or hides field "links"
  353.   --on section cards
  354.   set lockScreen to true
  355.   if hilite of the target is true then
  356.     hide background button "Links"
  357.     hide card field "Links"
  358.     set the hilite of the target to false
  359.   else
  360.     if card field "links" is empty then
  361.       beep 2
  362.       exit linkup
  363.     end if
  364.     if card field "lasttopic" is not empty then
  365.       send "popdown" to card button "box"
  366.     end if
  367.     show background button "Links"
  368.     show card field "Links"
  369.     set the hilite of the target to true
  370.   end if
  371.   set lockScreen to false
  372. end linkUp
  373.  
  374. on linkDown
  375.   --Called by Diamond Link button to close field Links;
  376.   --also called upon closeCard to put away links.
  377.   if hilite of background button "LinkUp" is true then
  378.     set lockScreen to true
  379.     hide background button "Links"
  380.     hide card field "Links"
  381.     set the hilite of background button "LinkUp" to false
  382.   end if
  383. end linkDown
  384.  
  385. on goLink
  386.   --Called by Links field when user clicks on line to select link.
  387.   global whereToGoBack
  388.   get lineSelect()
  389.   if it is empty then exit goLink
  390.   put diamondItem (it) into thisLink
  391.   push card
  392.   pop card into whereToGoBack
  393.   if the number of items in thisLink > 2 then
  394.     if item 1 of thisLink is empty then
  395.       go to card (item 3 of thisLink) of background (item 2 of thisLink)
  396.     else
  397.       go to card (item 3 of thisLink) of background (item 2 of thisLink) of stack (item 1 of thisLink)
  398.     end if
  399.   else
  400.     if item 1 of thisLink is empty then
  401.       go to card (item 2 of thisLink)
  402.     else
  403.       go to card (item 2 of thisLink) of stack (item 1 of thisLink)
  404.     end if
  405.   end if
  406. end goLink
  407.  
  408. on Xref cardName,stackName
  409.   --called by forward references; saves current card.
  410.   global whereToGoBack
  411.   push card
  412.   pop card into whereToGoBack
  413.   if the paramCount > 1 then
  414.     go to card (cardName) of stack (StackName)
  415.   else
  416.     go to card (cardName)
  417.   end if
  418. end Xref
  419.  
  420. ---General Button and Field Handlers
  421.  
  422. on getName stackName
  423.   --get word at click loc of field and find the card of that name
  424.   get clickSelect()
  425.   if the paramcount > 0 then
  426.     go to card (it) of stack StackName
  427.   else
  428.     go to card (it)
  429.   end if
  430. end getName
  431.  
  432. on returnToMark
  433.   --Handler called to mark current card or return to previous mark.
  434.   --With option key down, both actions are performed.
  435.   global whereToGoBack
  436.   if the optionKey is down then
  437.     if whereToGoBack is not empty then
  438.       flash 1
  439.       go to whereToGoBack
  440.       push recent card
  441.       pop card into whereToGoBack
  442.       exit returnToMark
  443.     end if
  444.   end if
  445.   visual effect zoom out
  446.   if whereToGoBack is empty then
  447.     answer "Mark this card?" with "Mark" or "Cancel"
  448.   else
  449.     if whereToGoBack contains the id of this card then
  450.       answer "This is the marked card."
  451.       exit returnToMark
  452.     end if
  453.     answer "Mark this card or Return to previous mark?" with "Mark" or "Return" or "Cancel"
  454.   end if
  455.   if it is "Cancel" then exit returnToMark
  456.   if it is "Mark" then
  457.     flash 1
  458.     push card
  459.     pop card into whereToGoBack
  460.   end if
  461.   if it is "Return" then
  462.     go to whereToGoBack
  463.   end if
  464. end returnToMark
  465.  
  466. on bulb CFnum
  467.   --Handler called by light bulb button.
  468.   --Shows pop up field while mouse is down.
  469.   if the paramCount is 1 then
  470.     put "card field" && CFnum into CF
  471.   else
  472.     put "card field" && the number of the target into CF
  473.   end if
  474.   show CF
  475.   set hilite of the target to true
  476.   wait until the mouse is up
  477.   hide CF
  478.   set hilite of the target to false
  479. end bulb
  480.  
  481. on showInfo
  482.   --Used when card button and card field have same number
  483.   --Clicking on the button shows the field.  Clicking on it
  484.   --again makes the field disappear.
  485.   get the number of the target
  486.   if the visible of card field (it) is true then
  487.     hide card field (it)
  488.     set hilite of button (it) to false
  489.   else
  490.     show card field (it)
  491.     set hilite of button (it) to true
  492.   end if
  493. end showInfo
  494.  
  495. on show2Info CF1, CF2
  496.   --Same as showInfo but allows multiple fields to be connect to
  497.   --the same button.  Also used when button and field number don't
  498.   --correspond.
  499.   if the visible of card field CF1 is true or the visible of card field CF2 is true then
  500.     hide card field CF1
  501.     hide card field CF2
  502.     set hilite of the target to false
  503.   else
  504.     show card field CF1
  505.     show card field CF2
  506.     set hilite of the target to true
  507.   end if
  508. end show2Info
  509.  
  510. on arrowPrev
  511.   --Called by screen arrow for previous card.
  512.   --Goes to previous card of the current background.
  513.   go to prev card of this background
  514.   repeat until the mouse is up
  515.     go to previous card of this background
  516.     set lockScreen to false
  517.     repeat 10 times
  518.       wait 2
  519.       if the mouse is up then exit arrowPrev
  520.     end repeat
  521.   end repeat
  522. end arrowPrev
  523.  
  524. on arrowNext
  525.   --Called by screen arrow for next card.
  526.   --Goes to next card of the current background.
  527.   go to next card of this background
  528.   repeat until the mouse is up
  529.     go to next card of this background
  530.     set the lockScreen to false
  531.     repeat 10 times
  532.       wait 2
  533.       if the mouse is up then exit arrowNext
  534.     end repeat
  535.   end repeat
  536. end arrowNext
  537.  
  538. on topicCardSeek
  539.   -- Allow navigation in a topic deck by specifying the card number
  540.   -- relative to the section.
  541.   ask "Go to what card in this section?" with 1
  542.   put it into goToNum
  543.   if goToNum is 1 then
  544.     go to first card of this background
  545.   else
  546.     put field 3 into cardNum
  547.     if goToNum > last word of cardNum or goToNum < 0 then
  548.       exit topicCardSeek
  549.     else
  550.       put the number of this card into currentCard
  551.       put first word of cardNum into currentSeq
  552.       if currentSeq < goToNum then
  553.         go to card (currentCard + (goToNum-currentSeq))
  554.       else
  555.         if currentSeq > goToNum then
  556.           go to card (currentCard - (currentSeq-goToNum))
  557.         else
  558.           exit topicCardSeek
  559.         end if
  560.       end if
  561.     end if
  562.   end if
  563. end topicCardSeek
  564.  
  565. on flipThru
  566.   --Handler called by FlipThru button, simulating show all cards.
  567.   set lockScreen to false
  568.   repeat until the mouseClick
  569.     go to next card
  570.   end repeat
  571. end flipThru
  572.  
  573.  
  574. on showNote
  575.   --Handler for card button "notes" (asterisk icon)
  576.   --Shows or hides note.
  577.   if the visible of card field "Notes" is true
  578.   then
  579.   hide card field "Notes"
  580. else
  581.   show card field "Notes"
  582. end if
  583. end showNote
  584.  
  585. on enterKey
  586.   --Handler that prompts user to create Note.
  587.   answer "Attach A Note To This Card?" with "OK" or "Cancel"
  588.   if it is "OK" then
  589.     makeNote
  590.   end if
  591. end enterKey
  592.  
  593. on deleteNote
  594.   --Called when note field exists; use it to delete note.
  595.   answer "Note Exists. Do You Want to Delete It?" with "Delete" or "Cancel"
  596.   if it is "Delete" then
  597.     set lockScreen to true
  598.     set cursor to 4
  599.     choose button tool
  600.     click at the loc of card button "Notes"
  601.     doMenu "Cut Button"
  602.     choose field tool
  603.     show card field "Notes"
  604.     click at the loc of card field "Notes"
  605.     doMenu "cut field"
  606.     choose browse tool
  607.     set lockScreen to false
  608.     put the script of this card into scriptTemp
  609.     repeat with J = 1 to the number of lines in scriptTemp
  610.       if line J in scriptTemp is "on enterKey" then
  611.         delete line J to (J+2) in scriptTemp
  612.         set the script of this card to scriptTemp
  613.         exit repeat
  614.       end if
  615.     end repeat
  616.   end if
  617. end deleteNote
  618.  
  619. on goNuts
  620.   --Called by Open Nut or Tree buttons to go back up hierarchy.
  621.   if the number of this card is 1 then
  622.     go to stack "Nutshell"
  623.   else
  624.     go to first card
  625.   end if
  626. end goNuts
  627.  
  628. on indexScript
  629.   answer "Go to Topic Index for this stack or all stacks?" with the short name of this stack or "Overall" or "Cancel"
  630.   if it is "overall" then
  631.     go to last card of "Nutshell"
  632.   else if it is "Cancel" then
  633.     exit indexScript
  634.   else
  635.     go to last card
  636.   end if
  637. end indexScript
  638.  
  639. on showFields
  640.   --display all overlapping fields; placed in card handler
  641.   repeat with J = 1 to the number of card fields
  642.     set visible of card field J to true
  643.   end repeat
  644. end showFields
  645.  
  646. on overlapFields
  647.   --hides fields overlapping target field
  648.   if the target contains "bkgnd button" then exit overlapFields
  649.   if the target contains "card field" then
  650.     repeat with J = 1 to the number of card fields
  651.       if the number of the target = J then
  652.         set visible of card field J to true
  653.       else
  654.         if visible of card field J is true and the number of the target < J then
  655.           set visible of card field J to false
  656.         end if
  657.       end if
  658.     end repeat
  659.     global helpLevel
  660.     if helpLevel > 0 then
  661.       put "Click outside visible box to redisplay others"
  662.     end if
  663.   else
  664.     showFields
  665.   end if
  666. end overlapFields
  667.  
  668. on uncoverFields
  669.   if the target contains "card button" then
  670.     if hilite of the target is true
  671.     then
  672.     set the hilite of the target to false
  673.   else
  674.     set the hilite of the target to true
  675.   end if
  676.   repeat with J = 1 to 3
  677.     if J is not the number of the target then
  678.       set hilite of card button J to false
  679.       set visible of card field (J*2) to false
  680.       set visible of card field (J*2-1) to false
  681.     end if
  682.   end repeat
  683.   put (the number of the target * 2) into targNum
  684.   set visible of card field (targNum-1) to true
  685.   set visible of card field targNum to true
  686. end if
  687. end unCoverFields
  688.  
  689. -- Special functions
  690.  
  691. function lineSelect
  692. --returns the entire line when user clicks on locked field
  693. if the style of the target is "scrolling" then
  694.   put 20 into inFromRight
  695. else
  696.   put 2 into inFromRight
  697. end if
  698. set the lockText of the target to false
  699. click at (first item of the rect of target), (second item of the clickLoc)
  700. click at (third item of the rect of target)-inFromRight, (second item of the clickLoc) with shiftKey
  701. set cursor to 4
  702. set the lockText of the target to true
  703. if selection is empty then beep
  704. return selection
  705. end lineSelect
  706.  
  707. function clickSelect
  708. --returns a word when a user clicks on a locked field
  709. --hold down Shift key; and click again to select phrase
  710. set the lockText of the target to false
  711. if the shiftKey is down then
  712.   put 1 into doShift
  713. else
  714.   put 0 into doShift
  715. end if
  716. click at the ClickLoc
  717. click at the ClickLoc
  718. if doShift is 1 then
  719.   --set cursor to 1
  720.   wait until the mouseClick
  721.   click at the ClickLoc with shiftkey
  722.   click at the ClickLoc with shiftkey
  723. end if
  724. set the lockText of the target to true
  725. if selection is empty then beep
  726. return selection
  727. end clickSelect
  728.  
  729. function lineClicked
  730. --returns a line number of line where users clicks on locked field.
  731. return (((item 2 of the clickloc - item 2 of the rect of the target) div the textHeight of the target) + 1 + trunc (scroll of the target/textHeight of the target))
  732. end lineClicked
  733.  
  734. function diamondItem String
  735. --replaces the diamond char (215) with a comma
  736. --also deletes spaces before and after diamond
  737. put String into record
  738. put numToChar(215) into diamond
  739. repeat while record contains diamond
  740.   put offset(diamond,record) into DiamondChar
  741.   put "," into char DiamondChar of record
  742.   if DiamondChar is 1 then
  743.     delete char DiamondChar+1 of record
  744.   else
  745.     delete char DiamondChar-1 of record
  746.     delete char DiamondChar of record
  747.   end if
  748. end repeat
  749. return record
  750. end diamondItem
  751.  
  752. ---- Stack Specific Handlers
  753.  
  754. on openStack
  755.   global IntroExit
  756.   push recent card
  757.   pop card into it
  758.   if "help" is not in it then
  759.     put it into IntroExit
  760.   end if
  761.   setUpMenus
  762. end openStack
  763.  
  764. on closeStack  --  delete the menus we've created using the globals saved in openStack
  765.   global menu1
  766.   put DeleteMenu(menu1) into menu1  --  clearing global for safety
  767.   --placemark
  768.   set lockmessages to true
  769.   set lockScreen to true
  770.   go to card 2
  771.   send popdown to this card
  772.   set lockMessages to false
  773. end closeStack
  774.  
  775. on bird buttonToFlash
  776.   set lockScreen to true
  777.   put the rect of button "Bird" into BirdNest
  778.   get the rect of card field "Bird"
  779.   set the rect of button bird to (item 1 of it+1), (item 2 of it-20), (item 1 of it + 200), (item 2 of it+8)
  780.   show card field "bird"
  781.   set lockScreen to false
  782.   if the paramCount = 1 then
  783.     repeat until the mouseClick
  784.       show buttonToFlash
  785.       wait 5
  786.       hide buttonToFlash
  787.     end repeat
  788.     show buttonToFlash
  789.   else
  790.     wait until the mouseClick
  791.   end if
  792.   hide card field "bird"
  793.   set the rect of button "bird" to BirdNest
  794. end bird
  795.  
  796. on countCards
  797.   global topicListEnd
  798.   put 1 into topicListEnd
  799.   set lockscreen to true
  800.   put the id of this card into BeginList
  801.   repeat
  802.     go to next card of this background
  803.     if the id of this card is BeginList then
  804.       exit repeat
  805.     else
  806.       add 1 to topicListEnd
  807.       put the id of this card into EndList
  808.     end if
  809.   end repeat
  810.   choose button tool
  811.   put 1 into curNum
  812.   repeat
  813.     put curNum && "of" && topicListEnd into field 3
  814.     add 1 to curNum
  815.     if the id of this card is EndList then
  816.       exit repeat
  817.     end if
  818.     go to next card of this background
  819.   end repeat
  820.   set lockScreen to false
  821. end countCards
  822.  
  823. on exitScript
  824.   global IntroExit
  825.   get IntroExit
  826.   if it contains "Home" or it contains "Help" or it is empty then
  827.     answer "Exit to Home or Quit HyperCard?" with "Home" or "Quit" or "Cancel"
  828.   else
  829.     put it into PreviousStack
  830.     answer "Exit to previous stack or Quit HyperCard?" with "Previous" or "Quit" or "Cancel"
  831.   end if
  832.   if it is "Cancel" then exit exitScript
  833.   if it is "quit" then
  834.     answer "Are you sure?" with "Yes" or "No"
  835.     if it is "yes" then
  836.       doMenu "quit hypercard"
  837.     end if
  838.   else
  839.     if it is "Home" then
  840.       go home
  841.     else
  842.       go to previousStack
  843.     end if
  844.   end if
  845. end exitScript
  846.  
  847. on FlashButton CorB, buttonID, timesToRepeat
  848.   if CorB is "B" then
  849.     put "background button " & quote & buttonID & quote into buttonID
  850.   else
  851.     put "button " & quote & buttonID & quote into buttonID
  852.   end if
  853.   if the paramCount < 3 then
  854.     put 3 into timesToRepeat
  855.   end if
  856.   repeat timesToRepeat
  857.     set hilite of buttonID to true
  858.     wait 10
  859.     set hilite of buttonID to false
  860.   end Repeat
  861. end FlashButton
  862.  
  863. on displayField fieldNum
  864.   set the visible of card field fieldNum to true
  865.   set the hilight of the target to true
  866.  
  867.   repeat until the mouseClick
  868.     set hilite of the target to true
  869.     wait 10
  870.     set hilite of the target to false
  871.   end Repeat
  872.   set the visible of card field fieldNum to false
  873.   set the hilight of the target to false
  874. end displayField
  875.  
  876. on setUpMenus  --  display new menus
  877.   global menu1, menu2, listOfStacks,stackRef
  878.   put 8 into stackRef
  879.   put "put NewMenu(" & quote & "Nutshells" & quote & "," & listofStacks &") into menu1" into firstMenu
  880.   do firstMenu
  881.   if menu1 is 0 then answer("Unable to make menu 'Nutshells'") with "Drat"
  882.   --stack Dependent
  883.   checkMenu menu1,stackRef,True
  884. end setUpMenus
  885. on doMenu which  --  get our menu items from doMenu before HyperCard does...
  886.   global listOfCards
  887.   visual effect dissolve
  888.   if which is in listofCards then
  889.     repeat with J = 1 to the number of lines in listofCards
  890.       get line J of listofCards
  891.       if which is in last word of it then
  892.         go to (it)
  893.         exit repeat
  894.       end if
  895.     end repeat
  896.   else pass doMenu  --  Remember to pass on menu commands you don't trap!
  897. end doMenu
  898. on makeNote
  899.   --Called when EnterKey is pressed and note does
  900.   --not exist. Creates a note field and asterisk button.
  901.   set the cursor to 4
  902.   set lockscreen to true
  903.   doMenu "new button"
  904.   get "card button id" && the id of button "new button"
  905.   set the name of it to "notes"
  906.   set the style of it to transparent
  907.   set the rect of it to 224,27,248,50
  908.   set the showName of it to false
  909.   set the icon of it to 7077
  910.   set the autoHilite of it to true
  911.   choose browse tool
  912.   set the lockScreen to false
  913.   put the number of card fields into CF
  914.   put "on mouseUp" & Return & "showNote" & Return & "end mouseUp" into showNoteButton
  915.   set the script of card button "Notes" to showNoteButton
  916.   set the lockScreen to true
  917.   doMenu "new field"
  918.   add 1 to CF
  919.   set the name of card field CF to "notes"
  920.   set the style of card field "notes" to scrolling
  921.   set the rect of card field "notes" to 264,28,489,79
  922.   choose browse tool
  923.   put the script of this card into scriptTemp
  924.   put "on enterKey" & Return & "deleteNote" & Return & "end enterKey" & Return before scriptTemp
  925.   set the script of this card to scriptTemp
  926.   set lockScreen to false
  927. end makeNote
  928.  
  929.  
  930.